/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package edu.ccut.titan.component.impl;

import edu.ccut.titan.component.IBaseComponentInfo;
import edu.ccut.titan.component.IComponent;
import edu.ccut.titan.component.IParameterInfo;
import edu.ccut.titan.component.TitanComponentException;

import java.util.List;

/**
 * Base component information implementation
 * 
 * @see IBaseComponentInfo
 * @author LeslieGu
 */
public class TitanBaseComponentInfo extends AbstractComponentInfo implements
		IBaseComponentInfo {

	private Class<?> className;

	public TitanBaseComponentInfo() {
	}

	public TitanBaseComponentInfo(String symbolicName, String key, String name,
			String description, Class<?> className,
			List<IParameterInfo> parameterInfos) {

		super(symbolicName, key, name, description, parameterInfos);
		this.className = className;
	}

	public Class<?> getClassType() {
		return className;
	}

	public void setClassName(Class<?> className) {
		this.className = className;
	}

	public IComponent createComponent() throws TitanComponentException {
		Class<?> componentType = this.getClassType();

		IComponent component = null;
		try {
			component = (IComponent)componentType.newInstance();
			component.setComponentFullKey(this.getFullKey());
		} catch (Exception e) {
			throw new TitanComponentException(e);
		}
		
		logger.debug("create base component \"" + super.getFullKey() + "\"");
		return (IComponent) component;
	}
}
